<!--
  #%L
  OfficeFloor
  %%
  Copyright (C) 2005 - 2020 Daniel Sagenschneider
  %%
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  #L%
  -->

<!doctype html>
<html>
<head>
<title>OfficeFloor - Inversion of Coupling Control</title>
<meta name="author" content="Daniel Sagenschneider" />
<meta http-equiv="Content-Language" content="en" />
<link rel="shortcut icon" href="./favicon.ico" />

<meta charset="utf-8">
<meta name="viewport"
	content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet"
	href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"
	integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB"
	crossorigin="anonymous">

<link rel="stylesheet" href="./css/Landing.css" type="text/css" />

<!-- Social Media sharing -->
<meta name="description"
	content="OfficeFloor is inversion of coupling control" />

<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@sagenschneider">
<meta name="twitter:title" content="OfficeFloor">
<meta name="twitter:description"
	content="OfficeFloor is inversion of coupling control">
<meta name="twitter:creator" content="@sagenschneider">
<meta name="twitter:image"
	content="http://officefloor.net/images/OfficeFloorBannerImage.png">

<!-- Open Graph data -->
<meta property="og:title" content="OfficeFloor" />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://officefloor.net" />
<meta property="og:image"
	content="http://officefloor.net/images/OfficeFloorBannerImage.png" />
<meta property="og:description"
	content="OfficeFloor is inversion of coupling control" />
<meta property="og:site_name" content="OfficeFloor" />

</head>
<body>

	@GITHUB

	<header class="container-fluid">
		<div class="row align-items-center">
			<div class="col-hidden col-sm-1"></div>
			<div class="col-12 col-sm-5">
				<img class="officefloor-banner-image"
					src="http://officefloor.net/images/OfficeFloorBannerImage.png"
					alt="OfficeFloor" />
			</div>
			<div class="col-12 col-sm-5 text-right">
				<span id="version">v@VERSION</span> &nbsp; <a class="link-button"
					href="./about.html">About</a>&nbsp;&nbsp;&nbsp;<a
					class="link-button" href="./tutorials/index.html">Tutorials</a>&nbsp;&nbsp;&nbsp;<a
					class="link-button" href="http://sagenschneider.blogspot.com">Blog</a>&nbsp;&nbsp;&nbsp;<a
					class="link-button" href="./install.html" target="_blank">Install&nbsp;Now</a>
			</div>
			<div class="col-hidden col-sm-1"></div>
		</div>
	</header>

	<section class="container-fluid banner">
		<div class="row text-center">
			<div class="col-12">
				<h1>OfficeFloor</h1>
				<div class="ioc">
					<p>
						OfficeFloor is <a
							href="https://sagenschneider.blogspot.com/2019/02/inversion-of-coupling-control.html"
							target="_blank">inversion of coupling control</a> that enables
						building applications via <a
							href="https://sagenschneider.blogspot.com/2019/04/oo-functional-imperative-reactive.html"
							target="_blank">First-Class Procedures</a>
					</p>
					<p>
						In other words, <a
							href="https://sagenschneider.blogspot.com/2019/06/local-microservices-first-class.html"
							target="_blank">local microservices</a>
					</p>
				</div>
			</div>
		</div>
	</section>

	<section class="container">
		<div class="row">
			<div class="col-12 videocenter">
				<iframe width="937" height="527"
					src="https://www.youtube.com/embed/2BMkRDrvK58" frameborder="0"
					allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
					allowfullscreen></iframe>
			</div>
		</div>
	</section>

	<section class="container">
		<div class="row">
			<div class="col-12 col-md-6 text-right">
				<img class="graphical-configuration-image"
					src="./images/GraphicalConfiguration.png" />
			</div>
			<div class="col-12 col-md-6 info-text">
				<p>Dependency Injection was an evolution in the way objects are
					managed.</p>
				<p>OfficeFloor is another evolution with:</p>
				<ul>
					<li>Continuation Injection managing the functions</li>
					<li>Thread Injection managing the threads</li>
				</ul>
				<p>These new dimensions do not mean more complexity in your
					code.</p>
				<p>The more complete paradigm means less "work around" code you
					need to manage. Plus new capabilities are introduced such as
					complete graphical configuration of your applications.</p>
				<p>
					<a
						href="https://sagenschneider.blogspot.com/2019/02/inversion-of-coupling-control.html"
						target="_blank">Read more ...</a>
				</p>
			</div>
		</div>
	</section>

	<section class="container">
		<div class="row">
			<div class="col-12 col-md-6 info-text">
				<p>OfficeFloor is a fundamental change to blend:</p>
				<ul>
					<li>functional and object-oriented techniques</li>
					<li>blocking and non-blocking I/O patterns</li>
					<li>a host of new more complete concepts</li>
				</ul>
				<p>into a unified First-Class Procedure model.</p>
				<p>First-Class Procedures give you all the benefits of
					microservices, without the heavy overheads!</p>
				<p>
					<a
						href="https://sagenschneider.blogspot.com/2019/04/oo-functional-imperative-reactive.html"
						target="_blank">Read more ...</a>
				</p>
			</div>
			<div class="col-12 col-md-6 text-left">
				<img class="inversion-of-control-image"
					src="./images/InversionOfControl.png" />
			</div>
		</div>
	</section>

	<section class="container">
		<div class="row">
			<div class="col-12 col-md-6">
				<img class="performance-image" src="./images/performance.png" />
			</div>
			<div class="col-12 col-md-6">
				<p>OfficeFloor measures performance in two key aspects</p>
				<ul>
					<li>rapid application development and ease of changes (<a
						href="./tutorials/index.html">see tutorials</a>)
					</li>
					<li>runtime performance (<a
						href="https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune&f=zijunz-zik0zj-zik0zj-zik0zj-zik0zj-zijzen-zik0zj-zik0zj-zik0xr-e7"
						target="_blank">see comparisons</a>)
					</li>
				</ul>
				<p>OfficeFloor enables faster building of faster applications.</p>
			</div>
		</div>
	</section>

	<footer>
		<div class="container">
			<div class="row">
				<div class="col-xs-hidden col-md-2"></div>
				<div class="col-xs-12 col-md-2 footer-link-col">
					<a href="./install.html">Install</a>
					<p>Try out OfficeFloor</p>
				</div>
				<div class="col-xs-hidden col-md-1"></div>
				<div class="col-xs-12 col-md-2 footer-link-col">
					<a href="./tutorials/index.html">Tutorials</a>
					<p>Check out the tutorials covering various features of
						OfficeFloor</p>
				</div>
				<div class="col-xs-hidden col-md-1"></div>
				<div class="col-xs-12 col-md-2 footer-link-col">
					<a href="./getting-help.html">Help</a>
					<p>Get help in using Officefloor</p>
				</div>
				<div class="col-xs-hidden col-md-2"></div>
			</div>
		</div>

		<div id="copyright">
			<p>Copyright &#169; 2005-2020. All Rights Reserved.</p>
		</div>
		<div id="copyright-clear"></div>
	</footer>


	<script type="text/javascript">
		// Google
		var _gaq = _gaq || [];
		_gaq.push([ '_setAccount', 'UA-23477455-1' ]);
		_gaq.push([ '_trackPageview' ]);

		(function() {
			var ga = document.createElement('script');
			ga.type = 'text/javascript';
			ga.async = true;
			ga.src = ('https:' == document.location.protocol ? 'https://ssl'
					: 'http://www')
					+ '.google-analytics.com/ga.js';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(ga, s);
		})();
	</script>
	<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
		integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
		crossorigin="anonymous"></script>
	<script
		src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
		integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
		crossorigin="anonymous"></script>
	<script
		src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"
		integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T"
		crossorigin="anonymous"></script>

</body>
</html>
